/*
 * Std.java
 *
 *  created: 4.8.2011
 *  charset: UTF-8
 *  license: MIT (X11) (See LICENSE file for full license)
 */
package cz.mp.util.console;

import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

/**
 * Třída {@code Std} slouží pro zápis textů na <tt>stdout</tt> a <tt>stderr</tt>
 * ve správném kódování znaků.
 * (Např. ve windows (CZ) konzoli je to <tt>cp852</tt>, přestože jinak je
 *  výchozí kódování <tt>windows-1250</tt>).
 * (Další motivací bylo to, že někdy nelze použít třídu 
 *  {@linkplain java.io.Console}, např. pro výstup v NetBeans.)
 * 
 * @author Martin Pokorný
 * @version 0.1
 * @see Application#CONSOLE_DEFAULT_CHARSET
 */
public class Std {

    // "doubleton" std, err    
    private static Std out = null;    
    private static Std err = null;
    
    private PrintWriter stdWriter = null;
    
    /**
     * 
     * @param out 
     */
    private Std(PrintStream out) {
        initStdConsole(out);
    }

    /**
     * Inicializace.
     * Voláno konstruktorem.
     */
    private void initStdConsole(PrintStream printStream) {
        OutputStreamWriter osw = null;
        try {
            osw = new OutputStreamWriter(printStream, 
                    ConsoleCharset.getName());
        } catch (UnsupportedEncodingException ex) {
            osw = new OutputStreamWriter(printStream);                    
        }
        
        boolean autoFlush = true;
        stdWriter = new PrintWriter(osw, autoFlush);
    }
    
    /**
     * Získá <tt>stdout</tt> s nastaveným kódováním znaků podle OS.
     * 
     * @return 
     * @see Application#CONSOLE_DEFAULT_CHARSET
     */
    public static Std out() {
        if (out == null) {
            out = new Std(System.out);
        }
        return out;
    }
    
    /**
     * Získá <tt>stderr</tt> s nastaveným kódováním znaků podle OS.
     * 
     * @return 
     * @see Application#CONSOLE_DEFAULT_CHARSET
     */
    public static Std err() {
        if (err == null) {
            err = new Std(System.err);
        }
        return err;
    }

    /**
     * 
     * @param text 
     */
    public void println(String text) {
        stdWriter.println(text);
//        stdWriter.flush();
    }
    
    /**
     * Získá instanci {@code PrintWriter}, do které je přesměrován
     * <tt>stdout</tt> nebo <tt>stderr</tt>.
     * <p>
     * Nezavírat!
     * 
     * @return 
     */
    public PrintWriter getWriter() {        
        return stdWriter;
    }
    
}   
